'''
破解数独游戏

'''
import pygame
from pygame.color import THECOLORS as COLORS

from build import jie_matrix


# 绘制背景部分，这里就是9*9的九宫格
def draw_background():
    # 白色背景
    screen.fill(COLORS['white'])

    # 函数：pygame.draw.rect(Surface, color, Rect, width=0)
    # 介绍：绘制矩形。在 Surface 对象上绘制一个矩形。width 参数指定边框的宽度，如果设置为 0 则表示填充该矩形。
    # 介绍：Rect 参数指定矩形的位置和尺寸。( left , top, width, height )
    # 画九宫格，画黑框部分
    # 竖的框
    pygame.draw.rect(screen, COLORS['black'], (0, 0, 150, 450), 5)
    pygame.draw.rect(screen, COLORS['black'], (150, 0, 150, 450), 5)
    pygame.draw.rect(screen, COLORS['black'], (300, 0, 150, 450), 5)
    # 横的框
    pygame.draw.rect(screen, COLORS['black'], (0, 0, 450, 150), 5)
    pygame.draw.rect(screen, COLORS['black'], (0, 150, 450, 150), 5)
    pygame.draw.rect(screen, COLORS['black'], (0, 300, 450, 150), 5)


# 将用户选中的背景改为蓝色块表示选中
def draw_choose():
    pygame.draw.rect(screen, COLORS['blue'], (cur_j * 50 + 5, cur_i * 50 + 5, 50 - 10, 50 - 10), 0)


# 绘制九宫格中的数字
def draw_number():
    for i in range(len(MATRIX)):
        for j in range(len(MATRIX[0])):
            # font.render参数意义：.render（内容，是否抗锯齿，字体颜色）
            # 抗锯齿：
            #   由于在3D图像中，受分辨的制约，物体边缘总会或多或少的呈现三角形的锯齿，
            #   而抗锯齿就是指对图像边缘进行柔化处理，使图像边缘看起来更平滑，更接近实物的物体。它是提高画质以使之柔和的一种方法。
            # 编辑数独里的数字
            txt = font80.render(str(MATRIX[i][j] if MATRIX[i][j] not in [0, '0'] else ''), True, COLORS['gray'])
            x, y = j * 50 + 15, i * 50 + 5
            # 将数字显示出来
            screen.blit(txt, (x, y))


def draw_number_answer():
    for i in range(len(MATRIX)):
        for j in range(len(MATRIX[0])):
            _color = COLORS['green'] if MATRIX[i][j] == 0 else COLORS['gray']
            # font.render参数意义：.render（内容，是否抗锯齿，字体颜色）
            # 抗锯齿：
            #   由于在3D图像中，受分辨的制约，物体边缘总会或多或少的呈现三角形的锯齿，
            #   而抗锯齿就是指对图像边缘进行柔化处理，使图像边缘看起来更平滑，更接近实物的物体。它是提高画质以使之柔和的一种方法。
            # 编辑数独里的数字
            txt = font80.render(str(MATRIX_ANSWER[i][j]), True, _color)
            x, y = j * 50 + 15, i * 50 + 5
            # 将数字显示出来
            screen.blit(txt, (x, y))


if __name__ == "__main__":
    # pygame初始化
    pygame.init()

    SIZE = [450, 550]  # 游戏界面尺寸
    # pygame.font.SysFont(name, size, bold=False, italic=False) -> Font
    #   从系统字体库创建一个 Font 对象。
    font80 = pygame.font.SysFont('freesans', 40)  # 数字样式

    # 创建游戏主界面
    screen = pygame.display.set_mode(SIZE)

    # 变量
    cur_i, cur_j = 0, 0
    answer = False

    # 数独
    MATRIX = [[0] * 9 for i in range(0, 9)]
    MATRIX_ANSWER = [[0] * 9 for i in range(0, 9)]  # 获取答案

    # 主循环，负责监听鼠标键盘时间，以及刷新界面内容，以及检查是否赢得了游戏
    running = True  # 游戏是否运行
    while running:
        for event in pygame.event.get():  # pygame.event.get：从队列中获取事件
            if event.type == pygame.QUIT:
                running = False
                break
            elif event.type == pygame.MOUSEBUTTONDOWN:  # 鼠标键按下事件：pygame.MOUSEBUTTONDOWN
                cur_j, cur_i = int(event.pos[0] / 50), int(event.pos[1] / 50)
                # event.pos: 鼠标当前坐标值（x，y），相对于窗口左上角。 (cur_i, cur_j)：当前选中位置对应数独数字的坐标
            elif event.type == pygame.KEYUP:  # pygame.KEYUP 释放键盘按钮事件
                # 判断键盘输入的是否数字，以及判断当前坐标是否空格
                if chr(event.key) in ['1', '2', '3', '4', '5', '6', '7', '8', '9']:
                    MATRIX[cur_i][cur_j] = int(chr(event.key))  # 将数字填入数独
                if chr(event.key) in [' ']:
                    MATRIX_ANSWER = jie_matrix(MATRIX)
                    answer = True
        # 绘制背景部分，9*9的九宫格
        draw_background()
        # 将用户选中的背景改为蓝色块表示选中
        draw_choose()
        if answer:
            draw_number_answer()
        else:
            # 绘制九宫格中的数字
            draw_number()
        # 更新Surface到屏幕上的完整显示
        pygame.display.flip()

    pygame.quit()
    print(MATRIX)
